# @file CMakeLists.txt
# @brief 图像修复系统的CMake构建配置文件
#
# 这个文件定义了项目的构建规则、依赖关系和编译选项

# 设置CMake最低版本要求
cmake_minimum_required(VERSION 3.16)

# 定义项目基本信息
project(image_inpainting VERSION 0.1 LANGUAGES CXX)

# 启用Qt的自动功能（UI编译、元对象编译、资源编译）
set(CMAKE_AUTOUIC ON)  # 自动处理.ui文件
set(CMAKE_AUTOMOC ON)  # 自动处理Qt的元对象系统
set(CMAKE_AUTORCC ON)  # 自动处理Qt资源文件

# 设置C++标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 查找OpenCV包 - 图像处理核心库
find_package(OpenCV REQUIRED)

# 查找Qt包 - GUI框架
# 同时查找Qt5和Qt6，优先使用找到的版本
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets Sql)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Sql)

# 设置项目源文件列表
# 包含所有需要编译的.cpp和.h文件
set(PROJECT_SOURCES
    main.cpp
    mainwindow.cpp
    mainwindow.h
    src/gui/imagecanvas.cpp      # 图像显示和绘制组件
    src/gui/imagecanvas.h
    src/gui/controlpanel.cpp     # 控制面板组件
    src/gui/controlpanel.h
    src/algorithms/inpaintingengine.cpp  # 修复算法引擎
    src/algorithms/inpaintingengine.h
)

# 包含头文件目录，让编译器能找到所有头文件
include_directories(${CMAKE_CURRENT_SOURCE_DIR})

# 根据Qt版本创建可执行文件
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    # Qt6版本的配置
    find_package(Qt6 REQUIRED COMPONENTS Widgets)
    find_package(Qt6 REQUIRED COMPONENTS Core)

    # 创建可执行文件，MANUAL_FINALIZATION用于跨平台配置
    qt_add_executable(image_inpainting
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
        src/gui/controlpanel.h src/gui/controlpanel.cpp
        src/algorithms/inpaintingengine.h
        src/algorithms/inpaintingengine.cpp
    )
else()
    # Qt5版本的配置
    if(ANDROID)
        # Android平台需要创建共享库
        add_library(image_inpainting SHARED
            ${PROJECT_SOURCES}
        )
    else()
        # 其他平台创建可执行文件
        add_executable(image_inpainting
            ${PROJECT_SOURCES}
        )
    endif()
endif()

# 链接必要的库到可执行文件
target_link_libraries(image_inpainting PRIVATE
    Qt${QT_VERSION_MAJOR}::Widgets  # Qt窗口部件库
    Qt${QT_VERSION_MAJOR}::Sql      # Qt数据库库（可能用于未来扩展）
    ${OpenCV_LIBS}                  # OpenCV图像处理库
)
target_link_libraries(image_inpainting PRIVATE Qt6::Widgets)
target_link_libraries(image_inpainting PRIVATE Qt6::Core)

# 包含OpenCV头文件目录
target_include_directories(image_inpainting PRIVATE ${OpenCV_INCLUDE_DIRS})

# 设置目标属性 - 主要用于macOS打包
if(${QT_VERSION} VERSION_LESS 6.1.0)
  set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.image_inpainting)
endif()

# 配置应用程序属性
set_target_properties(image_inpainting PROPERTIES
    ${BUNDLE_ID_OPTION}
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}           # 版本号
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE        # 在macOS上创建应用程序包
    WIN32_EXECUTABLE TRUE     # 在Windows上创建图形界面程序
)

# Qt6的最终化配置
if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(image_inpainting)
endif()

# 在构建后显示配置信息，便于调试
message(STATUS "OpenCV library status:")
message(STATUS "    version: ${OpenCV_VERSION}")           # OpenCV版本
message(STATUS "    libraries: ${OpenCV_LIBS}")            # 链接的OpenCV库
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}") # 头文件路径

message(STATUS "Qt${QT_VERSION_MAJOR} found and configured successfully")
